# coding: utf-8
""" 协程是什么:
	01.子程序也就是函数
	02.执行中不可中断的子程序叫线程
	03.执行中可中断的子程序叫协程
	例如:
		a.在所有语言中都是层级调用的, 比如A调用B, B子程序又调用C, C执行完返回, B执行完返回, 最后A执行完毕, 所以子程序调用是通过栈实现的, 像这种调用顺序明确的执行方式就是线程做的事情

		b.子程序A在执行过程中, 在子程序A内部中断, 然后去执行子程序B, A没有调用B, B执行到一半又跑去执行A, 那么A, B都是协程, 子程序之间相互切换是用程序内部控制的
		优势是没有线程切换的开销, 当线程越多(线程之间开销越大, 多线程还有全局锁机制, 影响性能)的时候, 协程优势越大
"""

def consumer():
    r = ''
    while True:
        n = yield r # 1.启动生成器后, 程序卡在这个位置,
                    # 2.当再次发送信号后, 继续往下执行, n就是发送过来的信号,
                    # 3.当再次遇到yield的时候返回结果给send
        print('[CONSUMER] Consuming %s...' % n)
        r = '200 OK'

# send(1) -> yield '200 OK' == 1 -> send(1) == '200 OK'
def produce(c):
    c.send(None)
    n = 0
    while n < 5:
        n = n + 1
        print(n)
        print('[PRODUCER] Producing %s...' % n)
        r = c.send(n)
        print('[PRODUCER] Consumer return: %s' % r)
        break
    c.close()

def test_yield():
    n = 'zzz'
    while True:
        if isinstance(n, int):
            print(n+1)
        else:
            print(n)
        n = yield 'r'
        print(n)

# c = consumer()
c = test_yield()
produce(c)